package com.atguigu.hbase.util;

import com.atguigu.array.MyArraysUtil;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * @ClassName DataUtils
 * @DeScription Hbase数据操作工具类
 * @Author 剧情再美终是戏
 * @Date 2019/12/8 8:36
 * @Version 1.0
 **/
public class DataUtils {

    private DataUtils() {
    }

    private static Logger logger = LoggerFactory.getLogger(DataUtils.class);


    /**
     * 添加数据
     *
     * @param conn   Hbase连接
     * @param nsName 库的名称，如果库为空,就使用default库
     * @param name   库的名称
     * @param put    添加数据put对象
     * @return boolean
     * @Author 剧情再美终是戏
     * @Date 2019/12/8
     * @Version 1.0
     **/
    public static boolean put(Connection conn, String nsName, String name, Put put) {
        if (null == conn || StringUtils.isBlank(name) || null == put) {
            logger.error("com.atguigu.hbase.util.DataUtils.put Method Param Error : conn, name, put  is require!");
            return false;
        }

        // 获取tableName对象
        TableName tn = TableName.valueOf(nsName, name);

        try (Table table = conn.getTable(tn)) {
            table.put(put);
            return true;
        } catch (Exception e) {
            logger.error("com.atguigu.hbase.util.DataUtils.put method param error : " + e);
            return false;
        }
    }

    /**
     * 删除数据
     *
     * @param conn   Hbase连接
     * @param nsName 库的名称，如果库为空,就使用default库
     * @param name   库的名称
     * @param delete 需要删除数据的对象
     * @return boolean
     * @Author 剧情再美终是戏
     * @Date 2019/12/8
     * @Version 1.0
     **/
    public static boolean del(Connection conn, String nsName, String name, Delete delete) {
        if (null == conn || StringUtils.isBlank(name) || null == delete) {
            logger.error("com.atguigu.hbase.util.DataUtils.del Method Param Error : conn, name, delete  is require!");
            return false;
        }

        // 获取tableName对象
        TableName tn = TableName.valueOf(nsName, name);

        try (Table table = conn.getTable(tn)) {
            table.delete(delete);
            return true;
        } catch (Exception e) {
            logger.error("com.atguigu.hbase.util.DataUtils.del method param error : " + e);
            return false;
        }
    }

    /**
     * 查询数据
     *
     * @param conn   Hbase连接
     * @param nsName 库的名称，如果库为空,就使用default库
     * @param name   库的名称
     * @param get    需要查询数据的对象
     * @return org.apache.hadoop.hbase.client.Result
     * @Author 剧情再美终是戏
     * @Date 2019/12/8
     * @Version 1.0
     **/
    public static Result get(Connection conn, String nsName, String name, Get get) {
        if (null == conn || StringUtils.isBlank(name) || null == get) {
            logger.error("com.atguigu.hbase.util.DataUtils.get Method Param Error : conn, name, delete  is require!");
            return null;
        }

        // 获取tableName对象
        TableName tn = TableName.valueOf(nsName, name);

        try (Table table = conn.getTable(tn)) {
            return table.get(get);
        } catch (Exception e) {
            logger.error("com.atguigu.hbase.util.DataUtils.get method param error : " + e);
            return null;
        }
    }


    /**
     * 查询数据
     *
     * @param conn   Hbase连接
     * @param nsName 库的名称，如果库为空,就使用default库
     * @param name   库的名称
     * @param scan   需要查询数据的对象
     * @return org.apache.hadoop.hbase.client.ResultScanner
     * @Author 剧情再美终是戏
     * @Date 2019/12/8
     * @Version 1.0
     **/
    public static ResultScanner scan(Connection conn, String nsName, String name, Scan scan) {
        if (null == conn || StringUtils.isBlank(name) || null == scan) {
            logger.error("com.atguigu.hbase.util.DataUtils.scan Method Param Error : conn, name, scan  is require!");
            return null;
        }

        // 获取tableName对象
        TableName tn = TableName.valueOf(nsName, name);

        try (Table table = conn.getTable(tn)) {
            return table.getScanner(scan);
        } catch (Exception e) {
            logger.error("com.atguigu.hbase.util.DataUtils.scan method param error : " + e);
            return null;
        }
    }

    /*
     * 打印数据
     * @Author 剧情再美终是戏
     * @Date  2019/12/8
     * @param result 单条记录的结果
     * @return void
     * @Version 1.0
     **/
    public static void priinInfo(Result result) {
        if (null == result) {
            return;
        }

        // 获取所有的单元格
        Cell[] cells = result.rawCells();

        // 遍历
        if (null != cells) {
            for (Cell cell : cells) {
                String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
                String family = Bytes.toString(CellUtil.cloneFamily(cell));
                String column = Bytes.toString(CellUtil.cloneQualifier(cell));
                String value = Bytes.toString(CellUtil.cloneValue(cell));
                System.out.printf("rowkey==>%s\tfamily==>%s\tcolumn==>%s\tvalue==>%s\n", rowkey, family, column, value);
            }
        }
    }
}
